#include<stdio.h>
#include<unistd.h>
#include<assert.h>
#include<string.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<stdlib.h>

#define MAX 1024//获取的字符串的大小
#define SIZE 64//指令数组的大小
#define SEP " "//分割的字符

int split(char*commandstr,char*argv[])
{
  assert(commandstr);
  assert(argv);

  argv[0]=strtok(commandstr,SEP);
  //argv[0]==NULL代表第一个就是空串，直接返回报错
  if(argv[0]==NULL)
  {
    return -1;
  }

  int i=1;
  while(1)
  {
    //strtok第一个参数传NULL，表示从上一次截断的位置开始往后截断
    argv[i]=strtok(NULL,SEP);
    if(argv[i]==NULL)
    {
      break;
    }
    i++;
  }
  return 0;
}


int main()
{
  while(1)
  {
    char commandstr[MAX]={0};//获取输入的字符
    char *argv[SIZE]={NULL};//截取命名的字符指针数组
    printf("[ljh@my_machine mybash]#");
    fflush(stdout);
    char*s=fgets(commandstr,sizeof(commandstr),stdin);//获取输入的字符并存在commandstr
    assert(s);//防止输入的字符串是空
    (void)s;//因为在release方式，assert会被去掉，导致s没有使用而带来编译告警，(void)强转仅仅是充当一次使用
    
    commandstr[strlen(commandstr)-1]='\0';//将fget获取的\n用\0替换掉，防止实际应用多出一个换行

    //接下来开始截断字符
    int n=split(commandstr,argv);
    if(n!=0)
    {
      //!=0代表截断失败，重新获取mingl
      continue;
    }

    //将程序调用交给子进程
    pid_t id=fork();
    if(id==0)
    {
      //child
      execvp(argv[0],argv);
      exit(-1);//如果execvp调用失败，直接exit(-1)
    }

    //father
    int status=0;
    waitpid(id,&status,0);

    
  }

  return 0;
}
